#pragma once

#include "kernel/interfaces/ILogger.h"
#include <memory>

// 前置声明
namespace spdlog {
    class logger;
    namespace level {
        enum level_enum : int;
    }
}

namespace kernel {
    class ILogger;
    class ILoggerFactory;
}

namespace infrastructure {
namespace logging {

// 类型别名简化代码
using LogLevel = kernel::ILogger::LogLevel;

/**
 * @brief 基于spdlog的日志器实现
 *
 * 真正的多日志器实现，每个实例对应一个独立的spdlog::logger，
 * 支持不同的输出目标、级别设置和格式配置。
 */
class SpdlogLogger : public kernel::ILogger {
public:
    explicit SpdlogLogger(const QString& name);
    explicit SpdlogLogger(const QString& name, std::shared_ptr<spdlog::logger> spdlogInstance);
    ~SpdlogLogger() override;

    // ILogger接口实现
    void log(LogLevel level, const QString& message,
             const char* file = nullptr, int line = 0,
             const char* function = nullptr) override;

    void debug(const QString& message) override;
    void info(const QString& message) override;
    void warning(const QString& message) override;
    void error(const QString& message) override;
    void critical(const QString& message) override;

    QString name() const override;
    void setLevel(LogLevel level) override;
    LogLevel level() const override;

    /**
     * @brief 静态方法：从全局Logger适配（保留兼容性）
     */
    static std::shared_ptr<SpdlogLogger> fromGlobalLogger(const QString& name);

    /**
     * @brief 获取底层spdlog实例（用于高级操作）
     */
    std::shared_ptr<spdlog::logger> spdlogInstance() const { return m_spdlogInstance; }

private:
    QString m_name;
    std::shared_ptr<spdlog::logger> m_spdlogInstance;

    // 转换辅助方法
    spdlog::level::level_enum toSpdLogLevel(LogLevel level) const;
    LogLevel fromSpdLogLevel(spdlog::level::level_enum level) const;
};

/**
 * @brief 增强的spdlog日志器工厂
 * 支持创建多种类型的日志器：控制台、文件、滚动文件等
 */
class SpdlogLoggerFactory : public ::kernel::ILoggerFactory {
public:
    SpdlogLoggerFactory();
    ~SpdlogLoggerFactory() override;

    // 基本接口实现
    std::shared_ptr<::kernel::ILogger> createLogger(const QString& name) override;
    std::shared_ptr<::kernel::ILogger> getDefaultLogger() override;

    // 扩展接口 - 支持更多类型的日志器
    /**
     * @brief 创建文件日志器
     */
    std::shared_ptr<::kernel::ILogger> createFileLogger(const QString& name, const QString& filePath);

    /**
     * @brief 创建滚动文件日志器
     */
    std::shared_ptr<::kernel::ILogger> createRotatingLogger(
        const QString& name, const QString& filePath,
        size_t maxSize = 1024 * 1024 * 10,  // 10MB
        size_t maxFiles = 3
    );

    /**
     * @brief 获取已存在的日志器（如果不存在则创建）
     */
    std::shared_ptr<::kernel::ILogger> getLogger(const QString& name);

private:
    std::shared_ptr<::kernel::ILogger> m_defaultLogger;
};

} // namespace logging
} // namespace infrastructure 